/**
 * request 网络请求工具
 * 更详细的 api 文档: https://github.com/umijs/umi-request
 */
import { extend } from 'umi-request';
// import { notification } from 'antd';
import pathToRegexp from 'path-to-regexp';
import qs from 'qs';
import {Modal} from "antd-mobile";

const codeMessage = {
    200: '服务器成功返回请求的数据。',
    201: '新建或修改数据成功。',
    202: '一个请求已经进入后台排队（异步任务）。',
    204: '删除数据成功。',
    400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
    401: '用户没有权限（令牌、用户名、密码错误）。',
    403: '用户得到授权，但是访问是被禁止的。',
    404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
    406: '请求的格式不可得。',
    410: '请求的资源被永久删除，且不会再得到的。',
    422: '当创建一个对象时，发生一个验证错误。',
    500: '服务器发生错误，请检查服务器。',
    502: '网关错误。',
    503: '服务不可用，服务器暂时过载或维护。',
    504: '网关超时。',
};

/**
 * 异常处理程序(这个异常处理，不管怎么样，即便没有异常也要走这个逻辑)
 */
const errorHandler = error => {
    const { response = {} } = error;
    console.log("===============>>>>>>>异常处理程序:", response, error)
    // 网络错误
    if(!(response instanceof {}) && response.status !== 200) {
        Modal.alert("网络发生错误！");
        throw new Error(); // 抛出异常之后，异常不会走到model
    }
};

/**
 * 配置request请求时的默认参数
 */
const request = extend({
    errorHandler, // 默认错误处理
    // credentials: 'include', // 默认请求是否带上cookie
});

/**
 * 响应拦截器，用来处理业务异常(必须要继续返回response,否则会有异常,因为后续还是要调用 response.clone())
 */
request.interceptors.response.use(async (response) => {
    // 处理文件下载的逻辑
    const contentType = response.headers.get('Content-Type');
    if(contentType === 'application/x-msdownload') {
        response.blob().then(blob => {
            const url = window.URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            const fileName = response.headers.get('Content-Disposition').split('=')[1];
            a.download = decodeURIComponent(fileName);
            // a.download = "filename.xlsx";
            a.click();
        })
    }

    const result = await response.clone().json();
    // 判断是否是未登录
    // if(result.status === 2) {
    //     window.location.href = '/user/login'; // 直接跳转到登录页面
    // }
    // 业务错误
    if(result.status !== 0 && result.status !== 2) {
        //TODO 提醒
        const url = window.location.href;
        if(result.status !== 1 && result.errorMsg !== '用户未登录或登录已失效') {
            Modal.alert(result.errorMsg);
        }
        throw new Error(result.errorMsg); // 为了不让响应数据返回到model，必须要抛出异常
    }
    return response; // 返回封装数据中的data部分
})

// request拦截器, 改变url 或 options.
request.interceptors.request.use((url, options) => {
    if(options.method.toLowerCase() === 'get') {
        const params = qs.stringify(options.data)
        if(params && params !== '') {
            url = `${url}?${params}`;
        }
    }
    console.log("====================>>>>>request:", url)
    return (
        {
            url,
            options: { ...options,
                // headers:{
                //     authToken: getToken()
                // }
            },
        }
    );
});


export default request;
